#ifndef HTTPREQUEST_H
#define HTTPREQUEST_H
#include "Buffer.hpp"
#include <string>
#include <map>
#include <algorithm>
#include <assert.h>
#include "url_utils.hpp"

enum class ParseState:char {
    ParseLine, // 第一行，请求行
    ParseHeaders, // 请求头
    ParseBody, // 请求体
    ParseDone, // 解析完毕
    ParseErr, // 解析错误
    ParseUndone // 解析未完成
};

class Buffer;

class HttpRequest{
public:
    HttpRequest();
    ~HttpRequest()=default;
    void reset();
    inline ParseState getState(){
        return currentState_;
    }
    void addHeader(const std::string& key, const std::string& value);
    std::string getHeader(const std::string& key);

    bool parseLine(Buffer* buffer);
    bool parseHeader(Buffer* buffer);
    bool parseBody(Buffer* buffer); //根据前面的长度读出剩余的内容

    bool peekBuffer(Buffer* buffer);// 查看buffer中是否有完整的http请求。

    
    void parseOneRequset(Buffer* buffer);

    std::string decodeMsg(std::string& from);
    const std::string getFileType(const std::string& name);

    const std::string getInfo();
    inline const std::string getVersion(){
        return version_;
    }
    inline const std::string getMethod() {
        return method_;
    }
    inline const std::string getUrl() {
        return url_;
    }

    inline const std::string getBody(){
        return body_;
    };


private:
    std::string method_;
    std::string url_;
    std::string urlParam_;
    std::string version_;
    std::map<std::string, std::string> reqHeaders_;
    std::string body_;
    ParseState currentState_;

    
};




#endif